package cn.ant.Client;

import cn.ant.utils.ChannelUtil;
import com.rabbitmq.client.Channel;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.time.LocalTime;

/**
 * 生产者（生产任务）
 *
 * @author Anhui AntLaddie <a href="https://juejin.cn/user/4092805620185316">(掘金蚂蚁小哥)</a>
 * @version 1.0
 **/
public class Producer {

    // 通过日志管理器获取Logger对象
    static Logger logger = LogManager.getLogger(Producer.class);
    // 简单队列名称
    public static final String QUEUE_NAME = "helloWorldQueue";

    public static void main(String[] args) throws IOException {
        // 通过工具类获取一个信道
        Channel channel = ChannelUtil.getChannel();

        // 声明一个队列（如果重复执行相同参数的队列创建则不会执行任何操作，当队列第二次创建时参数不同则报错）
        // 参数一：队列名称
        // 参数二：队列信息是否持久化，true代表队列在RabbitMQ重启后仍然存在，默认false。
        //      说明：这里是队列设置持久化，可不是消息持久化，消息持久化是后面设置的deliveryMode=2
        // 参数三：指定队列是否为独占队列，该队列是否只供一个消费者进行消费的独占队列。
        //      true = 该队列只能由当前第一个连接的消费者使用，连接关闭后队列将被删除。
        //      false = 允许多个消费者连接到该队列（默认值）
        // 参数四：指定队列是否在最后一个消费者断开连接后自动删除；
        //      true = 当最后一个消费者断开连接时，队列将被自动删除。
        //      false = 队列在消费者断开连接后仍然存在（默认值）。
        // 参数五：构建队列的其它属性，可以用于设置队列的额外属性，例如消息 TTL（生存时间）、最大长度等.
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);

        // 发送的消息
        byte[] msg = ("这是一条测试消息:" + LocalTime.now()).getBytes(StandardCharsets.UTF_8);
        // 发送消息
        // 参数一：要将消息发送到RabbitMQ服务器上的哪个交换机名称上。
        //      说明：交换机负责接收来自生产者的消息，并根据路由规则将消息转发到一个或多个队列。
        //      交换机的类型（如 `direct`、`fanout`、`topic`、`headers`）决定了消息的路由方式。
        // 参数二：设置路由的key是什么；用于确定消息应该被路由到哪个队列
        // 参数三：其它参数，如：内容类型、消息优先级、过期时间、消息持久性等
        // 参数四：发送的消息的具体内容，通常是一个字节数组（byte[]）
        channel.basicPublish("", QUEUE_NAME, null, msg);
        logger.info("生产者消息发送完成");
    }
}
